// g++ x.cpp -std=c++11
#include <iostream>
#include <vector>
#include "../sql/parser/Lexer.h"
#include "../sql/parser/Token.h"
#include "../utils/encode_util.h"
#include "../utils/log.h"

void test_0()
{
  string_ptr sql = make_string_ptr("SELECT /*mark for picman*/ * FROM WP_ALBUM WHERE MEMBER_ID = ? AND ID IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");

  string_ptr oracle = make_string_ptr("    SELECT  NVL(SUM(MISSIONNO), 0) DISTCNT, COUNT(DISTINCT(USERID)) USERIDCNT  FROM EVTSUPPLYHIST  WHERE EVTCODE = evtCode  AND EVTNO = evtNo  AND GIFTCODE = giftCode  AND SUPPLYDT BETWEEN TO_DATE(startDate, 'YYYY/MM/DD HH24:MI:SS')   AND TO_DATE(endDate, 'YYYY/MM/DD HH24:MI:SS')  ");

  std::wstring x = L"SELECT e.last_name    AS name, e.commission_pct comm, e.salary * 12    Annual FROM  scott.employees AS e WHERE  e.salary > 1000 ORDER  BY e.first_name, e.last_name;";
  Lexer_ptr lexer = Lexer_ptr(new Lexer(x));

  for (;;)
  {

    LOG_ERROR << "in test_0, step 1";

    lexer->nextToken();
    LOG_ERROR << "in test_0, step 2";

    Token_ptr tok = lexer->token();
    LOG_ERROR << "in test_0, step 3, toke is: " << tok;

    if (*tok == Token::IDENTIFIER)
    {
      LOG_ERROR << "\t\t" << __FILE__ << ": " << __LINE__ << ": Token is: " << tok->name << "\t\t, stringVal is: " << lexer->stringVal() << "<---- done";
    }
    else if (*tok == Token::MULTI_LINE_COMMENT)
    {
      LOG_ERROR << "\t\t" << __FILE__ << ": " << __LINE__ << ": Token is: " << tok->name << "\t\t, stringVal is: " << lexer->stringVal() << "<---- done";
    }
    else
    {
      LOG_ERROR << "\t\t" << __FILE__ << ": " << __LINE__ << ": Token is: " << tok->name << "\t\t, stringVal is: " << lexer->stringVal() << "<---- done";
    }

    if (*tok == Token::XEOF)
    {
      break;
    }
  }
}

void test_lexer()
{
  LOG_INFO << "in test_lexer";
  // string_ptr  sql = "SELECT * FROM T WHERE F1 = ? ORDER BY F2";
  std::wstring sql = L"SELECT ID, NAME, AGE FROM USER WHERE ID = ?";
  LOG_ERROR << "sql:" << encode_util::UnicodeToUTF8( sql);
  Lexer_ptr lexer = Lexer_ptr(new Lexer(sql));
  for (;;)
  {
    lexer->nextToken();
    Token_ptr tok = lexer->token();

    if (*tok == Token::IDENTIFIER)
    {

      LOG_ERROR << "1\t\t" << __FILE__ << ": " << __LINE__ << ": Token is: " << tok->getName() << "\t\t, stringVal is: " << lexer->stringVal() << "<---- done";
      // System.out.println(tok.name() + "\t\t" + lexer.stringVal());
    }
    else if (*tok == Token::LITERAL_INT)
    {

      LOG_ERROR << "2\t\t" << __FILE__ << ": " << __LINE__ << ": Token is: " << tok->getName() << "\t\t, stringVal is: " << lexer->stringVal() << "<---- done";
      // System.out.println(tok.name() + "\t\t" + lexer.numberString());
    }
    else
    {

      LOG_ERROR << "3\t\t" << __FILE__ << ": " << __LINE__ << ": Token is: " << tok->getName() << "\t\t, stringVal is: " << lexer->stringVal() << "<---- done";
      // System.out.println(tok.name() + "\t\t\t" + tok.name);
    }

    if (*tok == Token::WHERE)
    {
      // System.out.println("where pos : " + lexer.pos());
      LOG_ERROR << "\t\t" << __FILE__ << ": " << __LINE__ << ": Token is: " << tok->getName() << "\t\t, stringVal is: " << lexer->stringVal() << "<---- done";
    }

    if (*tok == Token::XEOF)
    {
      break;
    }
  }
}

int main(int argc, char **argv)
{
  // FLAGS_log_dir = "../logs";
  // google::InitGoogleLogging(argv[0]);
  // google::SetLogDestination(google::GLOG_INFO, "../logs/INFO_");
  // google::SetStderrLogging(google::GLOG_WARNING);
  test_0();
  test_lexer();
  return 0;
}
